# coding=utf-8
# 此文件中定义和用户登录,注册有关api
import re
from flask import current_app
from flask import request, jsonify
from flask import session
from ihome import redis_store, db
from ihome.api_1_0 import api
from ihome.models import User
from ihome.utils.commons import login_required
from ihome.utils.response_code import RET


@api.route("/users", methods=["POST"])
def register():
    """
        用户注册功能:
        1. 接收参数(手机号，短信验证码，密码)并进行参数校验
        2. 从redis中获取短信验证码(如果取不到，说明短信验证码已过期)
        3. 对比短信验证码，如果一致
        4. 创建User对象并保存注册用户的信息
        5. 把注册用户的信息添加进数据库
        6. 返回应答，注册成功
    """
    # 1.接收参数(手机号，短信验证码，密码)并进行参数校验
    req_dict = request.json
    mobile = req_dict.get("mobile")
    sms_code = req_dict.get("sms_code")
    password = req_dict.get("password")
    if not all([mobile, sms_code, password]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数不完整')
    if not re.match(r"^1[34578][0-9]{9}$", mobile):
        return jsonify(errno=RET.PARAMERR, errmsg='手机号不合法')
    # 2.从redis中获取短信验证码(如果取不到，说明短信验证码已过期)
    try:
        real_sms_code = redis_store.get("smscode:%s" % mobile)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='短信验证码读取异常')
    if not real_sms_code:
        return jsonify(errno=RET.DATAERR, errmsg='短信验证码已过期')
    # 3.对比短信验证码，如果一致
    if real_sms_code != sms_code:
        return jsonify(errno=RET.DATAERR, errmsg='短信验证码错误')
    # 4. 创建user对象并保存注册用户的信息
    user = User()
    user.mobile = mobile
    user.name = mobile
    # todo: 注册密码加密
    user.password = password
    # 5. 把注册用户的信息添加进数据库
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="保存注册用户信息失败")
    # 6.记住用户登录状态
    session["user_id"] = user.id
    session["username"] = user.name
    session["mobile"] = mobile
    # 7. 返回应答,注册成功
    return jsonify(errno=RET.OK, errmsg="注册成功")


@api.route('/sessions', methods=["POST"])
def login():
    """1. 获取参数
       2. 判断参数是否有值
       3. 判断手机号是否合法
       4. 查询数据库用户信息
       5. 用户不存在判断
       6. 校验密码
       7. 使用session保存用户信息
    """
    # 1.获取参数
    req_dict = request.json
    mobile = req_dict.get('mobile')
    password = req_dict.get('password')
    # 2.判断参数是否有值
    if not all([mobile, password]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不完整")
    # 3.判断手机号是否合法
    if not re.match(r"^1[34578][0-9]{9}$", mobile):
        return jsonify(errno=RET.PARAMERR, errmsg='手机号不合法')
    # 4.查询数据库用户信息
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='数据库查询错误')
    # 5.用户不存在判断
    if user is None:
        return jsonify(errno=RET.USERERR, errmsg='用户不存在')
    # # 6.校验密码
    if not user.check_user_password(password):
        return jsonify(errno=RET.LOGINERR, errmsg='密码错误')
    # 7.使用session保存用户信息
    session['user_id'] = user.id
    session['mobile'] = user.mobile
    session['name'] = user.name
    return jsonify(errno=RET.OK, errmsg='登录成功')


@api.route('/sessions', methods=["DELETE"])
@login_required
def logout():
    session.pop('name', None)
    session.pop('mobile', None)
    session.pop('user_id', None)
    return jsonify(errno=RET.OK, errmsg="OK")


@api.route('/session')
def check_login():
    username = session.get("name")
    user_id = session.get("user_id")
    resp = {
        "username": username,
        "user_id": user_id
    }
    if not username:
        return jsonify(errno=RET.SESSIONERR, errmsg="用户未登录")
    else:
        return jsonify(errno=RET.OK, errmsg="用户已登录", data=resp)

